import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import mplfinance as mpf
from datetime import datetime

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 读取Excel文件
df = pd.read_excel('c:\\chapter4\\比亚迪后复权历史行情数据.xlsx')

# 任务1: 观察数据形状，输出数据前5行，并对定量变量进行描述性分析
print("数据形状:", df.shape)
print("\n数据前5行:")
print(df.head())

# 假设数据包含日期、开盘价、最高价、最低价、收盘价、成交量等列
# 选择定量变量进行描述性分析
numeric_cols = df.select_dtypes(include=[np.number]).columns
print("\n定量变量描述性分析:")
print(df[numeric_cols].describe())

# 任务2: 计算变量之间的相关系数，并绘制相关系数热力图
corr_matrix = df[numeric_cols].corr()
print("\n相关系数矩阵:")
print(corr_matrix)

# 绘制相关系数热力图
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('变量相关系数热力图')
plt.tight_layout()
plt.savefig('c:\\chapter4\\correlation_heatmap.png')
plt.close()
print("\n相关系数热力图已保存为correlation_heatmap.png")

# 绘制2023年全年的收盘价时序图
if '日期' in df.columns:
    df['日期'] = pd.to_datetime(df['日期'])
    # 筛选2023年的数据
    df_2023 = df[df['日期'].dt.year == 2023]
    
    plt.figure(figsize=(12, 6))
    plt.plot(df_2023['日期'], df_2023['收盘'], 'b-', linewidth=2)
    plt.title('2023年全年收盘价时序图')
    plt.xlabel('日期')
    plt.ylabel('收盘价')
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.tight_layout()
    plt.savefig('c:\\chapter4\\2023_close_price.png')
    plt.close()
    print("2023年全年收盘价时序图已保存为2023_close_price.png")

# 任务4: 绘制2023年4月到2023年6月的K线图
if '日期' in df.columns:
    # 筛选2023年4月到6月的数据
    start_date = pd.Timestamp('2023-04-01')
    end_date = pd.Timestamp('2023-06-30')
    df_kline = df[(df['日期'] >= start_date) & (df['日期'] <= end_date)]
    
    # 准备K线图数据
    kline_data = df_kline[['日期', '开盘', '最高', '最低', '收盘', '成交量']].copy()
    # 重命名列以适配mplfinance
    kline_data.columns = ['日期', 'Open', 'High', 'Low', 'Close', 'Volume']
    kline_data.set_index('日期', inplace=True)
    
    # 绘制K线图
    mpf.plot(kline_data, type='candle', volume=True, figratio=(12, 6), style='charles',
             title='2023年4月-6月K线图',
             savefig='c:\\chapter4\\2023_kline.png')
    print("2023年4月-6月K线图已保存为2023_kline.png")
    
    # K线图分析
    print("\nK线图分析:")
    # 简单分析示例
    max_price = df_kline['最高'].max()
    min_price = df_kline['最低'].min()
    price_range = max_price - min_price
    avg_volume = df_kline['成交量'].mean()
    
    print(f"- 价格区间: {min_price:.2f} - {max_price:.2f}")
    print(f"- 价格波动幅度: {price_range:.2f}")
    print(f"- 平均成交量: {avg_volume:.2f}")
    
    # 分析涨跌幅
    # 数据中已经包含涨跌幅列，但为了确保准确性，我们重新计算
    df_kline['涨跌幅_计算'] = df_kline['收盘'].pct_change()
    positive_days = len(df_kline[df_kline['涨跌幅_计算'] > 0])
    negative_days = len(df_kline[df_kline['涨跌幅_计算'] < 0])
    
    print(f"- 上涨天数: {positive_days}")
    print(f"- 下跌天数: {negative_days}")

print("\n分析完成！所有图表已保存在当前目录。")